<!DOCTYPE html>
<!-- This test cannot be upstreamed to WPT because the equivalent version
  available in Web Platform Tests contains additional assertions which Chromium
  currently fails. This test should be persisted only to preserve test coverage
  until such time as the upstream version can be made to pass. See
  https://crbug.com/595993 -->
<title>Service Worker: FetchEvent.request passed to onfetch</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.js"></script>
<script>
'use strict';

promise_test(t => {
    var url = 'resources/request-end-to-end-worker.js';
    var scope = 'resources/blank.html';
    return service_worker_unregister_and_register(t, url, scope)
      .then(r => {
          add_completion_callback(() => { r.unregister(); });
          return wait_for_state(t, r.installing, 'activated');
        })
      .then(() => { return with_iframe(scope); })
      .then(frame => {
          add_completion_callback(() => { frame.remove(); });

          var result = JSON.parse(frame.contentDocument.body.textContent);
          assert_equals(result.url, frame.src, 'request.url');
          assert_equals(result.method, 'GET', 'request.method');
          assert_equals(result.referrer, location.href, 'request.referrer');
          assert_equals(result.mode, 'navigate', 'request.mode');
          assert_equals(result.credentials, 'include', 'request.credentials');
          assert_equals(result.redirect, 'manual', 'request.redirect');
          // TODO(falken): Chromium should fail this assertion but currently
          // passes it. The equivalent WPT test instead asserts:
          //   assert_equals(result.headers['user-agent'], undefined);
          // Once Chromium passes the WPT test assertion, this test file can be
          // removed.
          assert_equals(result.headers['user-agent'], navigator.userAgent,
                        'User-Agent header');
          assert_equals(result.append_header_error, 'TypeError',
                        'Appending a new header to the request must throw a ' +
                        'TypeError.')
        });
  }, 'Test FetchEvent.request passed to onfetch');
</script>
